Перейти к основному содержимому

5.02. Магические методы в Python

Разработчику Архитектору

Магические методы

Магические методы (dunder methods) — это специальные методы в языке Python, которые начинаются и заканчиваются двойным подчёркиванием.

Эти методы позволяют определять поведение объектов при выполнении различных операций.


Методы создания и представления объектов

ФункцияЗначениеПример
__new__Создаёт новый экземпляр классаdef __new__(cls): return super().__new__(cls)
__init__Инициализирует созданный экземплярdef __init__(self, value): self.value = value
__del__Вызывается при удалении объектаdef __del__(self): print("Объект удалён")
__repr__Официальное строковое представление объектаdef __repr__(self): return f"Point({self.x}, {self.y})"
__str__Неформальное строковое представление объектаdef __str__(self): return f"Точка ({self.x}, {self.y})"
__bytes__Преобразование объекта в байтыdef __bytes__(self): return bytes(str(self), 'utf-8')
__format__Форматирование объекта через format()def __format__(self, format_spec): return format(str(self), format_spec)
__hash__Вычисляет хэш объектаdef __hash__(self): return hash((self.x, self.y))
__bool__Преобразование объекта в логическое значениеdef __bool__(self): return self.value != 0

Методы преобразования типов

ФункцияЗначениеПример
__int__Преобразование в целое числоdef __int__(self): return int(self.value)
__float__Преобразование в число с плавающей точкойdef __float__(self): return float(self.value)
__complex__Преобразование в комплексное числоdef __complex__(self): return complex(self.value)
__index__Преобразование в целое для индексацииdef __index__(self): return int(self.value)
__round__Округление объектаdef __round__(self, n=0): return round(self.value, n)
__trunc__Усечение дробной частиdef __trunc__(self): return int(self.value)
__floor__Округление внизdef __floor__(self): return math.floor(self.value)
__ceil__Округление вверхdef __ceil__(self): return math.ceil(self.value)

Методы контейнеров и последовательностей

ФункцияЗначениеПример
__len__Возвращает длину объектаdef __len__(self): return len(self.items)
__getitem__Получение элемента по индексу или ключуdef __getitem__(self, key): return self.items[key]
__setitem__Установка значения по индексу или ключуdef __setitem__(self, key, value): self.items[key] = value
__delitem__Удаление элемента по индексу или ключуdef __delitem__(self, key): del self.items[key]
__iter__Возвращает итератор для объектаdef __iter__(self): return iter(self.items)
__next__Возвращает следующий элемент итератораdef __next__(self): return next(self.iterator)
__reversed__Возвращает обратный итераторdef __reversed__(self): return reversed(self.items)
__contains__Проверка наличия элемента в объектеdef __contains__(self, item): return item in self.items

Методы вызова и контекста

ФункцияЗначениеПример
__call__Делает объект вызываемым как функциюdef __call__(self, *args): return self.value + sum(args)
__enter__Вход в контекстный менеджерdef __enter__(self): return self
__exit__Выход из контекстного менеджераdef __exit__(self, exc_type, exc_val, exc_tb): self.close()

Методы сравнения

ФункцияЗначениеПример
__eq__Равенство (==)def __eq__(self, other): return self.value == other.value
__ne__Неравенство (!=)def __ne__(self, other): return self.value != other.value
__lt__Меньше (<)def __lt__(self, other): return self.value < other.value
__le__Меньше или равно (<=)def __le__(self, other): return self.value <= other.value
__gt__Больше (>)def __gt__(self, other): return self.value > other.value
__ge__Больше или равно (>=)def __ge__(self, other): return self.value >= other.value

Арифметические операции

ФункцияЗначениеПример
__add__Сложение (+)def __add__(self, other): return self.value + other.value
__sub__Вычитание (-)def __sub__(self, other): return self.value - other.value
__mul__Умножение (*)def __mul__(self, other): return self.value * other.value
__matmul__Матричное умножение (@)def __matmul__(self, other): return self.matrix @ other.matrix
__truediv__Деление (/)def __truediv__(self, other): return self.value / other.value
__floordiv__Целочисленное деление (//)def __floordiv__(self, other): return self.value // other.value
__mod__Остаток от деления (%)def __mod__(self, other): return self.value % other.value
__divmod__Возвращает кортеж (частное, остаток)def __divmod__(self, other): return divmod(self.value, other.value)
__pow__Возведение в степень (**)def __pow__(self, other): return self.value ** other.value
__lshift__Побитовый сдвиг влево (<<)def __lshift__(self, other): return self.value << other.value
__rshift__Побитовый сдвиг вправо (>>)def __rshift__(self, other): return self.value >> other.value
__and__Побитовое И (&)def __and__(self, other): return self.value & other.value
__or__Побитовое ИЛИ (``)
__xor__Побитовое исключающее ИЛИ (^)def __xor__(self, other): return self.value ^ other.value

Арифметические операции с отражением

ФункцияЗначениеПример
__radd__Отражённое сложениеdef __radd__(self, other): return other + self.value
__rsub__Отражённое вычитаниеdef __rsub__(self, other): return other - self.value
__rmul__Отражённое умножениеdef __rmul__(self, other): return other * self.value
__rmatmul__Отражённое матричное умножениеdef __rmatmul__(self, other): return other @ self.matrix
__rtruediv__Отражённое делениеdef __rtruediv__(self, other): return other / self.value
__rfloordiv__Отражённое целочисленное делениеdef __rfloordiv__(self, other): return other // self.value
__rmod__Отражённый остаток от деленияdef __rmod__(self, other): return other % self.value
__rdivmod__Отражённое деление с остаткомdef __rdivmod__(self, other): return divmod(other, self.value)
__rpow__Отражённое возведение в степеньdef __rpow__(self, other): return other ** self.value
__rlshift__Отражённый сдвиг влевоdef __rlshift__(self, other): return other << self.value
__rrshift__Отражённый сдвиг вправоdef __rrshift__(self, other): return other >> self.value
__rand__Отражённое побитовое Иdef __rand__(self, other): return other & self.value
__ror__Отражённое побитовое ИЛИ`def ror(self, other): return other
__rxor__Отражённое побитовое исключающее ИЛИdef __rxor__(self, other): return other ^ self.value

Унарные операции

ФункцияЗначениеПример
__abs__Абсолютное значениеdef __abs__(self): return abs(self.value)
__neg__Унарный минус (-)def __neg__(self): return -self.value
__pos__Унарный плюс (+)def __pos__(self): return +self.value
__invert__Побитовое НЕ (~)def __invert__(self): return ~self.value

Операции присваивания

ФункцияЗначениеПример
__iadd__Сложение с присваиванием (+=)def __iadd__(self, other): self.value += other.value; return self
__isub__Вычитание с присваиванием (-=)def __isub__(self, other): self.value -= other.value; return self
__imul__Умножение с присваиванием (*=)def __imul__(self, other): self.value *= other.value; return self
__imatmul__Матричное умножение с присваиванием (@=)def __imatmul__(self, other): self.matrix @= other.matrix; return self
__itruediv__Деление с присваиванием (/=)def __itruediv__(self, other): self.value /= other.value; return self
__ifloordiv__Целочисленное деление с присваиванием (//=)def __ifloordiv__(self, other): self.value //= other.value; return self
__imod__Остаток от деления с присваиванием (%=)def __imod__(self, other): self.value %= other.value; return self
__ipow__Возведение в степень с присваиванием (**=)def __ipow__(self, other): self.value **= other.value; return self
__ilshift__Сдвиг влево с присваиванием (<<=)def __ilshift__(self, other): self.value <<= other.value; return self
__irshift__Сдвиг вправо с присваиванием (>>=)def __irshift__(self, other): self.value >>= other.value; return self
__iand__Побитовое И с присваиванием (&=)def __iand__(self, other): self.value &= other.value; return self
__ior__Побитовое ИЛИ с присваиванием (`=`)
__ixor__Побитовое исключающее ИЛИ с присваиванием (^=)def __ixor__(self, other): self.value ^= other.value; return self

Атрибуты объекта

ФункцияЗначениеПример
__getattr__Вызывается при обращении к несуществующему атрибутуdef __getattr__(self, name): return f"Атрибут {name} не найден"
__getattribute__Вызывается при обращении к любому атрибутуdef __getattribute__(self, name): return object.__getattribute__(self, name)
__setattr__Вызывается при установке атрибутаdef __setattr__(self, name, value): self.__dict__[name] = value
__delattr__Вызывается при удалении атрибутаdef __delattr__(self, name): del self.__dict__[name]
__dir__Возвращает список атрибутов объектаdef __dir__(self): return ['x', 'y', 'z']

Дескрипторы

ФункцияЗначениеПример
__get__Получение значения атрибутаdef __get__(self, obj, objtype=None): return self.value
__set__Установка значения атрибутаdef __set__(self, obj, value): self.value = value
__delete__Удаление атрибутаdef __delete__(self, obj): del self.value
__set_name__Вызывается при создании класса для установки имениdef __set_name__(self, owner, name): self.name = name

Копирование и сериализация

ФункцияЗначениеПример
__copy__Создаёт поверхностную копию объектаdef __copy__(self): return type(self)(self.value)
__deepcopy__Создаёт глубокую копию объектаdef __deepcopy__(self, memo): return type(self)(copy.deepcopy(self.value, memo))
__getstate__Возвращает состояние объекта для сериализацииdef __getstate__(self): return self.__dict__
__setstate__Восстанавливает состояние объекта после десериализацииdef __setstate__(self, state): self.__dict__ = state
__reduce__Возвращает данные для сериализации через pickledef __reduce__(self): return (type(self), (self.value,))
__reduce_ex__Расширенная версия __reduce__def __reduce_ex__(self, protocol): return self.__reduce__()

Классовые методы

ФункцияЗначениеПример
__instancecheck__Проверка принадлежности к классуdef __instancecheck__(self, instance): return isinstance(instance, self._class)
__subclasscheck__Проверка наследованияdef __subclasscheck__(self, subclass): return issubclass(subclass, self._class)

Асинхронные операции

ФункцияЗначениеПример
__aiter__Возвращает асинхронный итераторdef __aiter__(self): return self
__anext__Возвращает следующий элемент асинхронного итератораasync def __anext__(self): return await self.fetch_next()
__aenter__Вход в асинхронный контекстный менеджерasync def __aenter__(self): return self
__aexit__Выход из асинхронного контекстного менеджераasync def __aexit__(self, exc_type, exc_val, exc_tb): await self.close()

Другие методы

ФункцияЗначениеПример
__sizeof__Возвращает размер объекта в памятиdef __sizeof__(self): return object.__sizeof__(self) + sys.getsizeof(self.value)
__await__Возвращает итератор для ожидания объектаdef __await__(self): return self.coroutine.__await__()
__prepare__Подготавливает пространство имён классаdef __prepare__(name, bases): return {}
__mro_entries__Определяет порядок разрешения методовdef __mro_entries__(self, bases): return (self.base,)